﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Web;
using System.Web.UI;

namespace UOL.PagSeguro {

    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [Description("Possibilita efetuar uma venda através do UOL PagSeguro")]
    [DefaultProperty("EmailCobranca")]
    [Designer(typeof(Design.VendaPagSeguroDesigner))]
    public class VendaPagSeguro : Control {

        private Comportamento _comportamento;
        private string _codigoReferencia;
        private string _emailCobranca;
        private string _moeda;
        private TipoCarrinho _tipoCarrinho;
        private Cliente _cliente;
        private List<Produto> _produtos;

        #region Propriedades
        /// <summary>
        /// Informa o comportamento do controle na submissão da venda.
        /// Se NovaPagina, uma nova janela do navegador será aberta. Se Redirect, a página será redirecionada para a página do PagSeguro
        /// </summary>
        public Comportamento Comportamento {
            get { return _comportamento; }
            set { _comportamento = value; }
        }
        /// <summary>
        /// Código identificador para seu site.
        /// Este campo é livre e poderá ser usado para identificar um cliente (cliente ID), o nº do pedido ou qualquer outra referência.
        /// Máximo de Caracteres: 200
        /// </summary>
        public string CodigoReferencia {
            get { return _codigoReferencia; }
            set { _codigoReferencia = value; }
        }
        /// <summary>
        /// Informar aqui o seu e-mail cadastrado e verificado pelo PagSeguro.
        /// Máximo de Caracteres: 200
        /// </summary>
        public string EmailCobranca {
            get { return _emailCobranca; }
            set { _emailCobranca = value; }
        }

        /// <summary>
        /// Formato da moeda utilizada pelo PagSeguro - BRL. Por enquanto, o PagSeguro aceita apenas pagamento em moeda brasileira (Real).
        /// Valor Padrão: BRL
        /// Máximo de Caracteres: 3
        /// </summary>
        public string Moeda {
            get { return _moeda; }
            set { _moeda = value; }
        }

        /// <summary>
        /// Tipo de POST que está sendo enviado ao PagSeguro.
        /// </summary>
        public TipoCarrinho TipoCarrinho {
            get { return _tipoCarrinho; }
            set { _tipoCarrinho = value; }
        }

        /// <summary>
        /// Dados do Cliente
        /// Campo Opcional
        /// </summary>
        public Cliente Cliente {
            get { return _cliente; }
            set { _cliente = value; }
        }

        /// <summary>
        /// Lista de produtos para esta venda
        /// </summary>
        public List<Produto> Produtos {
            get { return _produtos; }
            set { _produtos = value; }
        }
        #endregion

        public VendaPagSeguro()
            : this(string.Empty) {
        }

        public VendaPagSeguro(string emailCobranca) {
            this._moeda = "BRL";
            this._emailCobranca = emailCobranca;
            this.TipoCarrinho = TipoCarrinho.CarrinhoProprio;
            this.Comportamento = Comportamento.Redirecionar;
            this.Produtos = new List<Produto>();
        }

        public void Executar(System.Web.HttpResponse response) {
            StringBuilder sb = new StringBuilder();
            sb.Append("<html><head></head><body onLoad=\"document.forms[0].submit()\">");
            sb.AppendFormat("<form name=\"formPagSeguro\" target=\"" + (this.Comportamento == Comportamento.Redirecionar ? "_self" : "PagSeguro") + "\" action=\"{0}\" method=\"post\">", Resources.PagSeguro_Venda);

            NameValueCollection parametros = this.GetParametros();
            foreach (string chave in parametros.AllKeys) {
                sb.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", chave, parametros[chave]);
            }

            sb.Append("</form></body></html>");
            response.Write(sb.ToString());
            if (this.Comportamento == Comportamento.Redirecionar) {
                response.End();
            }
        }

        public NameValueCollection GetParametros() {
            NameValueCollection nvc = new NameValueCollection();
            if (!string.IsNullOrEmpty(this.CodigoReferencia)) {
                nvc.Add("ref_transacao", this.CodigoReferencia);
            }
            nvc.Add("email_cobranca", this.EmailCobranca);
            nvc.Add("moeda", this.Moeda);
            switch (this.TipoCarrinho) {
                case TipoCarrinho.CarrinhoProprio:
                    nvc.Add("tipo", "CP");
                    break;
                case TipoCarrinho.CarrinhoPagSeguro:
                    nvc.Add("tipo", "CBR");
                    break;
            }
            if (this.Cliente != null) {
                nvc.Add(this.Cliente.GetParametros());
            }
            for (int i = 0; i < this.Produtos.Count; i++) {
                nvc.Add(this.Produtos[i].GetParametros(i + 1));
            }
            return nvc;
        }

    }

    public enum Comportamento {
        NovaPagina,
        Redirecionar
    }

    public enum TipoCarrinho {
        CarrinhoProprio,
        CarrinhoPagSeguro
    }
}
